package com.sfx.concurrent.demo.concurrent.TestWaitNotify;

import lombok.extern.slf4j.Slf4j;

/**
 * Description:
 * 改进 : 加上 wait 和 notify 这样并发度大大提高,因为小南在等待的时候->调用wait
 * 会释放锁,这样其他线程就不用一直等着了,也可以执行.
 * 缺点 : 如果还有其他线程在等待,那么notify就会叫错人-->虚假唤醒
 */
@Slf4j(topic = "c.TestWaitNotify2")
public class TestWaitNotify2 {
    private static final Object room = new Object();
    private static boolean isCigarette = false;
    public static void main(String[] args) throws InterruptedException {
        //小南等烟
        new Thread(()->{
            synchronized (room) {
                log.debug("是否有香烟 : " +isCigarette);
                if(!isCigarette){
                    log.debug("没有香烟,干不了活,等一会");
                    try {
                        room.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                log.debug("是否有香烟 : " +isCigarette);
                if(isCigarette){
                    log.debug("小南开始干活");
                }
            }
        },"小南").start();

        //还有5个人也要去房间干活
        for(int i =0;i<5;++i){
            new Thread(()->{
                synchronized (room){
                    log.debug("开始干活");
                }
            },"其他人" + i).start();
        }

        Thread.sleep(1000);
        //还有一个线程来送烟
        new Thread(()->{
            synchronized (room){
                isCigarette = true;
                log.debug("送烟送到了");
                room.notify();
            }
        },"送烟的").start();
    }
}